/**
 * 请求验证中间件模块
 * 提供通用Joi验证功能和特定DTO的验证中间件
 * @module middleware/validationMiddleware
 */
import { UserLoginDTO, UserRegisterDTO } from '#src/module/user/dto/request/user.js';
import { ResponseHandler } from '#src/common/utils/http/responseHandler.js';
import { HTTP_STATUS } from '#src/constants/http.constants.js';

/**
 * 用户注册数据验证中间件
 * 使用UserRegisterDTO验证请求体中的注册数据
 * @param {Object} req - Express请求对象
 * @param {Object} res - Express响应对象
 * @param {Function} next - Express next函数
 * @returns {void|Object} 验证失败时返回400错误响应，成功时调用next()
 */
export const validateUserRegistration = (req, res, next) => {
    try {
        req.validatedData = UserRegisterDTO.fromRequest(req);
        next();
    } catch (error) {
        return res.status(HTTP_STATUS.BAD_REQUEST)
            .json(ResponseHandler.error(error.message, HTTP_STATUS.BAD_REQUEST));
    }
};

/**
 * 用户登录数据验证中间件
 * 使用UserLoginDTO验证请求体中的登录数据
 * @param {Object} req - Express请求对象
 * @param {Object} res - Express响应对象
 * @param {Function} next - Express next函数
 * @returns {void|Object} 验证失败时返回400错误响应，成功时调用next()
 */
export const validateUserLogin = (req, res, next) => {
    try {
        req.validatedData = UserLoginDTO.fromRequest(req);
        next();
    } catch (error) {
        return res.status(HTTP_STATUS.BAD_REQUEST)
            .json(ResponseHandler.error(error.message, HTTP_STATUS.BAD_REQUEST));
    }
};

/**
 * 创建通用Joi验证中间件的工厂函数
 * 生成一个使用指定DTO类验证请求数据的中间件
 * @template T
 * @param {Class<T>} DTOClass - 继承自BaseDTO的DTO类，必须实现fromRequest静态方法
 * @returns {Function} Express中间件函数
 * @example
 * // 使用示例
 * const validateUserUpdate = validateRequest(UserUpdateDTO);
 * router.put('/users/:id', validateUserUpdate, userController.update);
 */
export const validateRequest = (DTOClass) => {
  return (req, res, next) => {
    try {
      // 将验证后的数据附加到请求对象
      req.validatedData = DTOClass.fromRequest(req);
      next();
    } catch (error) {
      return res.status(HTTP_STATUS.BAD_REQUEST)
        .json(ResponseHandler.error(error.message, HTTP_STATUS.BAD_REQUEST));
    }
  };
};